package threadDemo;
import java.util.concurrent.atomic.AtomicReference;
/**
 * @author Ajie
 * @date 2023/8/8
 * @function 解决 cas aba 问题。
 *
 * 尽管 t1 线程已经修改了 atomicRef 的值，但 t2 线程仍然可以成功地进行 CAS 操作，这就是 ABA 问题。
 */
public class Atomic_CAS_ABAProblem_Demo {
//}

//public class ABAProblemDemo {
    private static AtomicReference<Integer> atomicRef = new AtomicReference<>(100);

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            atomicRef.compareAndSet(100, 101);//100-->101
            atomicRef.compareAndSet(101, 100);//101 -->100
        });

        Thread t2 = new Thread(() -> {
            try {
                // 使 t2 线程暂停1秒，确保 t1 线程完成了第一次修改
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //TODO 这个时候，100就不是原始的 100了。但是还修改成功。
            boolean isSuccess = atomicRef.compareAndSet(100, 101);
            System.out.println("compareAndSet result aba:"+isSuccess);  // 输出 true，尽管值已经被 t1 线程修改过
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}
